/*
 * FileName: emplace_back.cc
 * Author: 李波(Edwin Lee)
 * Date: 2024-07-27 15:52:40
 * Version: 1.0
 * Description: 测试emplace的用法（使用vector::emplace_back)
 */
#include <iostream>
#include <vector>
using namespace std;

class Test
{
public:
	Test(int a){cout<<"Test(int)"<<endl;}
	Test(int a,int b){cout<<"Test(int,int)"<<endl;}
	Test(const Test& t){cout<<"const Test(Test&)"<<endl;}
	Test(Test&& t){cout<<"Test(Test&&)"<<endl;}
	~Test(){cout<<"~Test()"<<endl;}

};

//测试vector::emplace_back()
void test1()
{
	Test t1(10);
	vector<Test> vec;
	vec.reserve(100);
	
	cout<<"--------------------------------"<<endl;
	// 直接插入对象，调用左值拷贝函数，两者是没有区别的
	vec.push_back(t1);
	vec.emplace_back(t1);
	
	cout<<"--------------------------------"<<endl;
	// 插入临时变量，调用右值拷贝函数，两者没有区别
	vec.push_back(Test(20));
	vec.emplace_back(Test(20));

	cout<<"--------------------------------"<<endl;
	// 给emplace传入Test对象构造所需要的参数，直接在容器底层构造对象即可
	vec.emplace_back(20);
	vec.emplace_back(30,40);

	cout<<"--------------------------------"<<endl;

}

int main()
{
	test1();
	return 0;
}
